/*******************************************************************************
  Main Source File

  Company:
    Microchip Technology Inc.

  File Name:
    main.c

  Summary:
    This file contains the "main" function for a project.

  Description:
    This file contains the "main" function for a project.  The
    "main" function calls the "SYS_Initialize" function to initialize the state
    machines of all modules in the system
 *******************************************************************************/

// *****************************************************************************
// *****************************************************************************
// Section: Included Files
// *****************************************************************************
// *****************************************************************************

#include <stddef.h>                     // Defines NULL
#include <stdbool.h>                    // Defines true
#include <stdlib.h>                     // Defines EXIT_FAILURE
#include "definitions.h"                // SYS function prototypes


int delay_Clock = 200000000;   //200MHz
int tempo_speed = 80;   //テンポ=80
int T4 = 750;   //四分音符の時間(長さ)  T4 = 750 [msec]  //T4 = 60 * 1000 / 80; 



void delay_us(volatile unsigned int usec)        //1μsec遅延
{
        volatile  int count;

        count = (int)(delay_Clock/20000000)*usec;


        do      //実測 at 200MH (Clock=200000000)
        {       //delay_us(1000):1000.4μsec  delay_us(100):100.6μsec  delay_us(10):10.5μsec  delay_us(1):1.5μsec
                asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP");asm("NOP");
                asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP");

                count--;
        }while(count != 0);


}

void delay_ms(volatile unsigned int msec)        //1msec遅延
{
        volatile unsigned int i;         //実測:at200MH (Clock=200000000)//delay_ms(1): 1.0006msec   delay_ms(100):100.04msec

        for(i=0; i<msec; i++)
        delay_us(1000);
}



void BuzFreq(volatile int Freq, volatile float Duty)    //PWM周波数(Freq) と デューティ(Duty)の設定関数
{
    volatile int myPR; //PWM周期のレジスタ値( = PR2 at Timer2)
    volatile int myDuty; //PWM出力ON時間に相当するレジスタ値(= OC1RS at OC1)
    volatile float PS_T2 = 16; //タイマ2のプリスケール値
    
    TMR2_Stop();//タイマ2ストップ
    
    //PWM周波数設定
    //PR(PRレジスタ値) = Fpbclk(ペリフェラルバスクロック周波数)/Fpwm(PWM周波数)/タイマプリスケール値  - 1;
 
    myPR = (int)(100000000/Freq/PS_T2 -1);
    TMR2_PeriodSet(myPR);   //周期レジスタ設定
    
    myDuty = (int)((float)PR2 * Duty);    
    OCMP1_CompareSecondaryValueSet(myDuty); //OC1のデューティ設定
//    OC1RS = (int)((float)PR2 * Duty);
    TMR2_Start();
}

void ClosePWM(void)
{
    TMR2_Stop();   //タイマ2ストップ
}

void Do_C4(void)  //第四オクターブ ド    //C4
{
    BuzFreq(261.63,0.5);//ド //261.63Hz
}

void Re_D4(void)  //第四オクターブ レ  //D4
{
    BuzFreq(293.67,0.5);   //レ //293.67Hz
}

void Mi_E4(void)  //第四オクターブ ミ    //E4
{
    BuzFreq(329.63,0.5);   //ミ //329.63Hz
}

void Fa_F4(void)  //第四オクターブ ファ    //F4
{
    BuzFreq(349.23,0.5);   //ファ //349.23Hz
}

void _SoL1(void)    //第四オクターブ ソ    //G4
{
    BuzFreq(392.00,0.5);   //ファ //349.23Hz
}



void La_A4(void)  //第四オクターブ ラ    //A4
{
    BuzFreq(440.00,0.7);   //ラ //440.00Hz
}

void La_sharpA4(void) //第四オクターブ #ラ(嬰イ) //A#4
{
    BuzFreq(466.16,0.7);   //ラ //466.16Hz
}


void Si_B4(void)      //第四オクターブ シ    //B4
{
    BuzFreq(493.88,0.4);   //シ //493.88Hz
}

void Do_C5(void)      //第五オクターブ ド    //C5
{
    BuzFreq(523.23,0.5);   //ド //523.23Hz
}

void Re_D5(void)        //第五オクターブ レ
{
    BuzFreq(587.34,0.5);   //レ //587.34Hz
}


void noSound(void)
{
    ClosePWM();
    delay_ms(50);

}



// *****************************************************************************
// *****************************************************************************
// Section: Main Entry Point
// *****************************************************************************
// *****************************************************************************

int main ( void )
{
    /* Initialize all modules */
    SYS_Initialize ( NULL );

    OCMP1_Enable ();    //OC1イネーブル

    while ( true )
    {
        /* Maintain state machines of all polled MPLAB Harmony modules. */
        SYS_Tasks ( );
        
                            
//第1行: うさぎ追いし かの山  -----------------------------------------------------------
//-----第一小節
            Fa_F4();    //ファ
            delay_ms(T4); //四分音符長さ
 
            noSound();

            Fa_F4();    //ファ
            delay_ms(T4); //四分音符長さ
            noSound();

            Fa_F4();    //ファ
            delay_ms(T4); //四分音符長さ
            noSound();

//------第二小節
            _SoL1();
            delay_ms(1125);//付点付四分音符長さ

     //       delay_ms(T4*1.5);//付点付四分音符長さ
            noSound();

            La_A4();  //ラ

            delay_ms(T4/2); //八分音符長さ
            noSound();

            _SoL1();
            delay_ms(750);

 //           delay_ms(T4);   //四分音符長さ
            noSound(); 

//-------第三小節
            La_A4();  //ラ
            delay_ms(T4);   //四分音符長さ
            noSound();

            La_A4();  //ラ
            delay_ms(T4);   //四分音符長さ
            noSound();

            La_sharpA4();  //シ (#ラ)
            delay_ms(T4);   //四分音符長さ
            noSound();
            
//--------第四小節
            Do_C5(); //ド
            delay_ms(T4*2); //二分音符長さ
            noSound();

            delay_ms(T4);   //四分休符



//第2行 こぶな釣りし かの川    ---------------------------------------------------------
//--------第一小節
            La_sharpA4();  //#ラ
            delay_ms(T4);
            noSound();

            Do_C5(); //ド
            delay_ms(T4); //四分音符長さ
            noSound();

            Re_D5();    //レ
            delay_ms(T4); //四分音符長さ
            noSound();

//---------第二小節
            La_A4(); //ラ
            delay_ms(T4*1.5);//付点付四分音符長さ
            noSound();

            La_sharpA4();  //シ (#ラ)
            delay_ms(T4/2);   //八分音符長さ
            noSound();

            La_A4(); //ラ
            delay_ms(T4);//付点付四分音符長さ
            noSound();

//----------第三小節
            _SoL1();
            delay_ms(750);
    //        delay_ms(T4);//付点付四分音符長さ
            noSound();

            _SoL1();
            delay_ms(750);
            //   delay_ms(T4);//付点付四分音符長さ

            noSound();

            Mi_E4();  //第四オクターブ ミ    //E4
            delay_ms(T4);//付点付四分音符長さ

            noSound();

//-----------第四小節
             Fa_F4();    //ファ
            delay_ms(T4*2); //二分音符長さ
            noSound();

            delay_ms(T4);   //四分休符


 //第3行  夢は今も めぐりて
//-----------第一小節
            _SoL1();
            delay_ms(T4/2);//八分音符長さ

            noSound();

            Fa_F4();    //ファ
            delay_ms(T4/2); //八分音符長さ

            noSound();


            _SoL1();
            delay_ms(T4);//四分音符長さ

            noSound();

            Do_C4();    //ド
            delay_ms(T4);//四分音符長さ

            noSound();

//------------第二小節
            Fa_F4();    //ファ

            delay_ms(T4/2); //八分音符長さ
            noSound();

            _SoL1();
            delay_ms(T4/2);//八分音符長さ
            noSound();

             La_A4(); //ラ
            delay_ms(T4);//四分音符長さ
            noSound();

             La_A4(); //ラ
            delay_ms(T4);//四分音符長さ
            noSound();

//------------第三小節
            La_sharpA4();  //シ (#ラ)
            delay_ms(T4/2);   //    八分音符長さ
            noSound();

            La_A4(); //ラ
            delay_ms(T4/2);//八分音符長さ
            noSound();

            La_sharpA4();  //シ (#ラ)
            delay_ms(T4*1.5);   //付点付四分音符長さ
            noSound();

            Re_D5();    //レ
            delay_ms(T4/2); //八分音符長さ
            noSound();


//-----------第四小節
            Do_C5(); //ド
            delay_ms(T4/2); //二分音符長さ
            noSound();

            La_sharpA4();  //シ (#ラ)
            delay_ms(T4/2);   //八分音符長さ
            noSound();

            La_A4(); //ラ
            delay_ms(T4);//四分音符長さ
            noSound();

            delay_ms(T4);   //四分休符


//第4行 忘れがたき 故郷(ふるさと)
//---------第一小節
            Do_C5(); //ド
            delay_ms(T4); //四分音符長さ
            noSound();

            Do_C5(); //ド
            delay_ms(T4); //四分音符長さ
            noSound();

            Do_C5(); //ド
            delay_ms(T4); //二分音符長さ
            noSound();

//----------第二小節
            Fa_F4();    //ファ
            delay_ms(T4*1.5); //付点付四分音符長さ
            noSound();

            _SoL1();
            delay_ms(T4/2);//八分音符長さ
            noSound();

             La_A4(); //ラ
            delay_ms(T4);//四分音符長さ
            noSound();

//----------第三小節
            La_sharpA4();  //シ (#ラ)
            delay_ms(T4);   //四分音符長さ
            noSound();

            La_sharpA4();  //シ (#ラ)
            delay_ms(T4);   //四分音符長さ
            noSound();

            _SoL1();
            delay_ms(T4);//四分音符長さ
            noSound();


//-----------第四小節
            Fa_F4();    //ファ
            delay_ms(T4*2); //二分音符長さ
            noSound();


            delay_ms(T4);   //四分休符
///--------------------------------------------------------------------------------


            delay_ms(3000);

    }

    /* Execution should not come here during normal operation */

    return ( EXIT_FAILURE );
}


/*******************************************************************************
 End of File
*/